package algorithm_training.seal;

import java.util.Scanner;

/**
 * 共有n种图案的印章，每种图案的出现概率相同。小A买了m张印章，求小A集齐n种印章的概率。
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        double p = 1.0 / n;
        if (m < n) {
            System.out.printf("%.4f", 0.0);
            return;
        }
        double[][] dp = new double[m][n];
        // 初始化
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (i == 0 && j == 0) {
                    dp[i][j] = 1;
                } else if (i > 0 && j == 0) {
                    // 一直在重复购买一种
                    dp[i][j] = Math.pow(p, i);
                } else if (i < j) {
                    dp[i][j] = 0.0;
                } else {
                    // 中间态分两种情况需要求和
                    dp[i][j] = dp[i - 1][j] * (j + 1) / n + dp[i - 1][j - 1] * (n - j) / n;
                }
            }
        }
        System.out.printf("%.4f", dp[m - 1][n - 1]);
    }

//    /**
//     * 求num的阶乘
//     * @param num
//     * @return
//     */
//    public static int factorial(int num) {
//        int res = 1;
//        for (int i = 2; i <= num; i++) {
//            res *= i;
//        }
//        return res;
//    }
}
